In data processing applications involving the transfer, manipulation, storage, and retrieval of large amounts of data, there is often a need for an operation that creates a copy of all of the data. For example, a copy may be performed in order to capture the data at a given instant in time for a backup.
In the case where the amount of data is large, a simple copy of all the data may be very time consuming. Consequently, many copy operations create two copies such that the copies share data that has not changed since the time the copy was made. In many cases, it is desirable that the mechanism that creates the copy has the following properties: atomicity, small creation time, the ability to create both read-only and read-write copies, and maximal data sharing.